/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ipartek.formacion.gestformwww.modelo.beans;

import com.ipartek.formacion.gestformwww.controlador.Verificador;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ResourceBundle;

/**
 * @version 1.0 12 Dic 2011
 * @author Curso: Ainhoa y Enrique
 * Clase que realiza el filtrado de las convocatorias segun los distintos criterios
 */
public class FiltroConvocatoria {

    private ResourceBundle bundle;
    private int estado;
    private String nombre;
    private int tipo;
    private String nomCurso;
    private String fechainiciocom;
    private String fechainiciofin;
    private String fechafincom;
    private String fechafinfin;
    private String lugar;
    private int duracion;
    private String columnafiltrar;
    private String orden;
    private int pagsiguiente;
    private int elementospag;


    /**
     * Constructor con todos los parámetros
     * @param bundle Resurso.
     * @param estado Indica el estado del curso 1='Todos',2='aplazados',3='No aplazados'.
     * @param nombre Buscará los cursos que contengan el valor de este parametro en su nombre.
     * @param tipo Buscará los cursos que contengan el valor de este parametro en su tipo.
     * @param cliente Buscará los cursos que contengan el valor de este parametro en el nombre del cliente del curso.
     * @param fechainicio Buscará los cursos que contengan el valor de este parametro en su fecha de inicio.
     * @param fechafin Buscará los cursos que contengan el valor de este parametro en su fecha de fin.
     * @param lugar Buscará los cursos que contengan el valor de este parametro en el lugar donde se imparten.
     * @param duracion Buscará los cursos que contengan el valor de este parametro en su duración.
     * @param columnafiltrar Indica la columna por la que se ordenará, debe estar mapeado en el Recurso.
     * @param orden Indica el orden que se aplicara. 'ASC'= Ascendente (por defecto), 'DESC'=descendente.
     * @param pagsiguiente Indica el número del la página siguiente.
     * @param elementospag Indica el nuemro de elementos que se mostraran por página.
     */
    public FiltroConvocatoria(ResourceBundle bundle, int estado, String nombre, int tipo, String nomCurso, String fechainiciocom, String fechainiciofin, String fechafincom, String fechafinfin, String lugar, int duracion, String columnafiltrar, String orden, int pagsiguiente, int elementospag) {
        this.bundle = bundle;
        this.estado = estado;
        this.nombre = nombre;
        this.tipo = tipo;
        this.nomCurso = nomCurso;
        this.fechainiciocom = fechainiciocom;
        this.fechainiciofin = fechainiciofin;
        this.fechafincom = fechafincom;
        this.fechafinfin = fechafinfin;
        this.lugar = lugar;
        this.duracion = duracion;
        this.columnafiltrar = columnafiltrar;
        this.orden = orden;
        this.pagsiguiente = pagsiguiente;
        this.elementospag = elementospag;
    }

    public int getDuracion() {
        return duracion;
    }

    public void setDuracion(int duracion) {
        this.duracion = duracion;
    }

    public int getElementospag() {
        return elementospag;
    }

    public void setElementospag(int elementospag) {
        this.elementospag = elementospag;
    }

    public int getEstado() {
        return estado;
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }

    public String getNomCurso() {
        return nomCurso;
    }

    public void setNomCurso(String nomCurso) {
        this.nomCurso = nomCurso;
    }

    public int getPagsiguiente() {
        return pagsiguiente;
    }

    public void setPagsiguiente(int pagsiguiente) {
        this.pagsiguiente = pagsiguiente;
    }

    public int getTipo() {
        return tipo;
    }

    public void setTipo(int tipo) {
        this.tipo = tipo;
    }

    public FiltroConvocatoria() {
    }
    
    /**
     * Metodo que inicializa los campos iniciales del filtro
     * @param bundle, mapa que contiene la relacion con los distintos campos mapeados en los
     * ficheros properties.
     */
    public FiltroConvocatoria(ResourceBundle bundle) {
        this.pagsiguiente = 1;
        this.estado = 1;
        this.tipo = 0;
        this.duracion = 0;
       // this.elementospag =20;
        this.elementospag = Integer.parseInt(bundle.getString("numRegPagConvocatorias"));
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Calendar fecha = Calendar.getInstance();
        fecha.add(Calendar.MONTH, -1);
        this.fechainiciocom = sdf.format(fecha.getTime()).trim();
        fecha = Calendar.getInstance();
        fecha.add(Calendar.MONTH, 1);
        this.fechainiciofin = sdf.format(fecha.getTime()).trim();


        
        this.bundle = bundle;
    }

    public ResourceBundle getBundle() {
        return bundle;
    }

    public void setBundle(ResourceBundle bundle) {
        this.bundle = bundle;
    }

    public String getnomCurso() {
        return nomCurso;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param nomCurso, objeto de tipo String
     */
    public void setnomCurso(String nomCurso) {
         if (Verificador.caracteresCorrectos(nomCurso)) {
            if (nomCurso != null) {
                this.nomCurso = nomCurso;
            }
        } else {
            this.nomCurso = null;
        }
    }

    public String getColumnafiltrar() {
        return columnafiltrar;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param columnafiltrar, objeto de tipo String
     */
    public void setColumnafiltrar(String columnafiltrar) {
        if (Verificador.caracteresCorrectos(columnafiltrar)) {
            if (columnafiltrar != null) {
                this.columnafiltrar = columnafiltrar;
            }
        } else {
            this.columnafiltrar = null;
        }
    }


    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param duracion, objeto de tipo String
     */
    public void setDuracion(String duracion) {
        if (Verificador.numeroValido(duracion)) {
            this.duracion = Integer.parseInt(duracion);
        } else {
            if (duracion != null) {
                this.duracion = 0;
            }
    }
    }


    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param elementospag, objeto de tipo String
     */
    public void setElementospag(String elementospag) {
        if (Verificador.numeroValido(elementospag)) {
            this.elementospag = Integer.parseInt(elementospag);
        }
    }

    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param estado, objeto de tipo String
     */
    public void setEstado(String estado) {
        if (Verificador.numeroValido(estado)) {
            this.estado = Integer.parseInt(estado);
        } else {
            if (estado != null) {
                this.estado = 1;
            }
        }
    }
    public String getFechafincom() {
        return fechafincom;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param fechafincom, objeto de tipo String
     */
    public void setFechafincom(String fechafincom) {
        if (!Verificador.fechaValida(fechafincom)) {
            this.fechafincom = "";
        } else {
            if (fechafincom != null) {
                this.fechafincom = fechafincom;
            }
        }

    }
    public String getFechafinfin() {
        return fechafinfin;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param fechafinfin, objeto de tipo String
     */
    public void setFechafinfin(String fechafinfin) {
       if (!Verificador.fechaValida(fechafinfin)) {
            this.fechafinfin = "";
       } else {
           if (fechafinfin != null) {
               this.fechafinfin = fechafinfin;
           }
       }
    }
    public String getFechainiciocom() {
        return fechainiciocom;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param fechainiciocom, objeto de tipo String
     */
    public void setFechainiciocom(String fechainiciocom) {
       if (Verificador.fechaValida(fechainiciocom)) {
           if (fechainiciocom != null) {
               this.fechainiciocom = fechainiciocom;
           }
       } else {
           this.fechainiciocom = null;
       }
    }
    public String getFechainiciofin() {
        return fechainiciofin;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param fechainiciofin, objeto de tipo String
     */
    public void setFechainiciofin(String fechainiciofin) {
        if (Verificador.fechaValida(fechainiciofin)) {
            if (fechainiciofin != null) {
                this.fechainiciofin = fechainiciofin;
            }
        } else {
            this.fechainiciofin = null;
        }
    }
    public String getLugar() {
        return lugar;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param lugar, objeto de tipo String
     */
    public void setLugar(String lugar) {
        if (Verificador.caracteresCorrectos(lugar)) {
            if (lugar != null) {
                this.lugar = lugar;
            }
        } else {
            this.lugar = null;
        }
    }

    public String getNombre() {
        return nombre;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param nombre, objeto de tipo String
     */
    public void setNombre(String nombre) {
        if (Verificador.caracteresCorrectos(nombre)) {
            if (nombre != null) {
                this.nombre = nombre;
            }
        } else {
            this.nombre = null;
        }
    }
    public String getOrden() {
        return orden;
    }
    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param orden, objeto de tipo String
     */
    public void setOrden(String orden) {
        if (Verificador.caracteresCorrectos(orden)) {
            if (orden != null) {
                this.orden = orden;
            }
        } else {
            this.orden = null;
        }
    }

    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param pagsiguiente, objeto de tipo String
     */
    public void setPagsiguiente(String pagsiguiente) {
        if (Verificador.numeroValido(pagsiguiente)) {
            this.pagsiguiente = Integer.parseInt(pagsiguiente);
        } else {
            this.pagsiguiente = 1;
        }
    }

    /**
     * Metodo set que realiza la modificacion y validacion de los datos introducidos
     * @param tipo, objeto de tipo String
     */
    public void setTipo(String tipo) {
        if (Verificador.numeroValido(tipo)) {
            this.tipo = Integer.parseInt(tipo);
        } else {
            if (tipo != null) {
                this.tipo = 0;
            }
        }
    }

    public String getSQL()
    {
        String sql = "";
        String filtro = "ORDER BY convocatoria.ConId";
        String and = "";
        String where = " WHERE ";
        if (columnafiltrar != null && !columnafiltrar.trim().equals("")) {
            String columna = bundle.getString(columnafiltrar);
            if (columna != null && !columna.trim().equals("")) {
                filtro = "ORDER BY " + columna;
                if (orden != null && !orden.trim().equals("")) {
                    if (orden.trim().equals("ASC") || orden.trim().equals("DESC")) {
                        filtro = filtro + " " + orden;
                    }
                }
            }
        }

        sql = "SELECT ConId,ConNom,ConHoraInicio,ConHoraFin,ConObservacion,ConLugarImpart,ConDuracion,"
                + "ConDuracionMinutos,ConFchaInPrev,ConFchaFinPrev,tipocurso.TipCurId,ConActiva,"
                + "Convocatoria.CurId,curso.CurNom "
                + "FROM convocatoria "
                + "LEFT JOIN tipocurso ON convocatoria.TipCurId=tipocurso.TipCurId "
                + "INNER JOIN curso ON curso.curId = convocatoria.curId";

        if (    //Si tiene algo añadimos el WHERE a la consulta sql
            (nombre != null && !nombre.trim().equals("")) ||
            (tipo != 0) ||
            (fechainiciocom != null && !fechainiciocom.trim().equals("")) ||
            (fechainiciofin != null && !fechainiciofin.trim().equals("")) ||
            (fechafincom != null && !fechafincom.trim().equals("")) ||
            (fechafinfin != null && !fechafinfin.trim().equals("")) ||
            (estado == 2) || (estado == 3)
           ){
            sql = sql + where;
            if ((nombre != null && !nombre.trim().equals(""))){ //Si tiene nombre
                sql = sql + "convocatoria.ConNom LIKE '%" + nombre + "%'";
                if (
                        (tipo != 0) ||
                        (fechainiciocom != null && !fechainiciocom.trim().equals("")) ||
                        (fechainiciofin != null && !fechainiciofin.trim().equals("")) ||
                        (fechafincom != null && !fechafincom.trim().equals("")) ||
                        (fechafinfin != null && !fechafinfin.trim().equals("")) ||
                        (estado == 2) || (estado == 3)
                    ) { //Si tiene mas parametros, agregar AND a la consulta sql
                    sql = sql + " AND ";
                }
            }
            if (tipo != 0){ //Si tiene tipo de curso
                sql = sql + "convocatoria.TipCurId=" + tipo;
                if (
                        (fechainiciocom != null && !fechainiciocom.trim().equals("")) ||
                        (fechainiciofin != null && !fechainiciofin.trim().equals("")) ||
                        (fechafincom != null && !fechafincom.trim().equals("")) ||
                        (fechafinfin != null && !fechafinfin.trim().equals("")) ||
                        (estado == 2) || (estado == 3)
                    ) { //Si tiene mas parametros, agregar AND a la consulta sql
                    sql = sql + " AND ";
                }
            }
            if (fechainiciocom != null && !fechainiciocom.trim().equals("")){ //Si tiene fecha de inicio desde
                sql = sql + "convocatoria.ConFchaInPrev>='" + fechainiciocom + "'";
                if (
                        (fechainiciofin != null && !fechainiciofin.trim().equals("")) ||
                        (fechafincom != null && !fechafincom.trim().equals("")) ||
                        (fechafinfin != null && !fechafinfin.trim().equals("")) ||
                        (estado == 2) || (estado == 3)
                    ) { //Si tiene mas parametros, agregar AND a la consulta sql
                    sql = sql + " AND ";
                }
            }
            if (fechainiciofin != null && !fechainiciofin.trim().equals("")){ //Si tiene fecha de inicio hasta
                sql = sql + "convocatoria.ConFchaInPrev<='" + fechainiciofin + "'";
                if (
                        (fechafincom != null && !fechafincom.trim().equals("")) ||
                        (fechafinfin != null && !fechafinfin.trim().equals("")) ||
                        (estado == 2) || (estado == 3)
                    ) { //Si tiene mas parametros, agregar AND a la consulta sql
                    sql = sql + " AND ";
                }
            }
            if (fechafincom != null && !fechafincom.trim().equals("")){ //Si tiene fecha de fin desde
                sql = sql + "convocatoria.ConFchaFinPrev>='" + fechafincom + "'";
                if (
                        (fechafinfin != null && !fechafinfin.trim().equals("")) ||
                        (estado == 2) || (estado == 3)
                    ) { //Si tiene mas parametros, agregar AND a la consulta sql
                    sql = sql + " AND ";
                }
            }
            if (fechafinfin != null && !fechafinfin.trim().equals("")){ //Si tiene fecha de fin hasta
                sql = sql + "convocatoria.ConFchaFinPrev<='" + fechafinfin + "'";
                if (
                        (estado == 2) || (estado == 3)
                    ) { //Si tiene mas parametros, agregar AND a la consulta sql
                    sql = sql + " AND ";
                }
            }
            if (estado == 2){ //Si tiene marcado las convocatorias activas
                sql = sql + "convocatoria.ConActiva=1";
            }
            if (estado == 3){ //Si tiene marcado las convocatorias activas
                sql = sql + "convocatoria.ConActiva=0";
            }
        }
        
        sql= sql + " " + filtro;
        return sql;
    }

    }





